package pritace

import "fmt"

func TestSlice()  {
	//声明切片的两种方式
	var a []int
	b := make([]int, 5)
	fmt.Print(a)
	fmt.Println(b)

}

func newSlice() {
	var array [30]int
	for i := 0; i <= len(array)-1; i++ {
		array[i] = i
	}
	slices := array[10:20]
	fmt.Println(slices)
	fmt.Println(array[10:])
	fmt.Println(len(array))
}

// 在切片开头添加元素一般都会导致内存的重新分配，而且会导致已有元素全部被复制 1 次，因此，从切片的开头添加元素的性能要比从尾部追加元素的性能差很多。

func appendSlices() {

	var a []int
	//在切片后面追加元素
	a = append(a, 1, 2, 3)
	//在接片后面追加一个切片
	a = append(a, []int{4, 5, 6}...) //打印结果[1 2 3 4 5 6]
	fmt.Println(a)

}

func copySlices() {

	slice1 := []int{1, 2, 3, 4, 5}
	slice2 := make([]int, len(slice1))
	copy(slice2, slice1) // 只会复制slice1的前n个元素到slice2中 这里的n指的是slice2的长度
	// copy(slice1, slice2) // 只会复制slice2的n个元素到slice1的前n个位置 这里的n指的是slice2的长度
	fmt.Println(slice2)
	fmt.Println("copySlices")
}

func testCopySlices() {
	// 设置元素数量为1000
	const elementCount = 1000
	// 预分配足够多的元素切片
	srcData := make([]int, elementCount)
	// 将切片赋值
	for i := 0; i < elementCount; i++ {
		srcData[i] = i
	}
	// 引用切片数据
	refData := srcData
	// 预分配足够多的元素切片
	copyData := make([]int, elementCount)
	// 将数据复制到新的切片空间中
	copy(copyData, srcData)
	// 修改原始数据的第一个元素
	srcData[0] = 999
	// 打印引用切片的第一个元素
	fmt.Println(refData[0])
	// 打印复制切片的第一个和最后一个元素
	fmt.Println(copyData[0], copyData[elementCount-1])
	// 复制原始数据从4到6(不包含)
	copy(copyData, srcData[4:6])
	for i := 0; i < 5; i++ {
		fmt.Printf("%d ", copyData[i])
	}
}

func delSlices() {
	seq := []string{"a", "b", "c", "d", "e"}
	// 指定删除位置
	index := 2
	fmt.Println(seq[:index], seq[index+1:])
	fmt.Println(append(seq[:index], seq[index+1:]...))
}

//从头部删除元素
func headDelSlices() {
	a := []int{1, 2, 3}

	/*****移动指针的方式从头部删除一个元素*****/
	// a = a[1:]
	// fmt.Println(a) 从头部删除一个元素
	// fmt.Println(a[n:]) 从头部删除n个元素

	/*****不移动指针分方式从头部删除元素*****/
	// a = append(a[:0], a[1:]...)
	// fmt.Println(a)
	// a = a[:copy(a, a[1:])]
	// fmt.Println(a)

	/****删除中间一个元素****/
	// i := 2
	// a = append(a[:i], a[i+1:]...) // 删除中间1个元素
	// fmt.Println(a)

	/*****从尾部删除一个元素*****/
	a = a[:len(a)-1]
	fmt.Println(a)

}

//二维切片
func qrSlices() {

	var slices [][]int
	slices = [][]int{{10}, {20}}
	// fmt.Println(slices)
	slices[0] = append(slices[0], 202)
	fmt.Println(slices)
}

func insertSlice() {
	var s = []int{1, 2, 3, 5, 6, 7}
	s = append(s[:3], append([]int{4}, s[3:]...)...)

	fmt.Println(s)

}